package com.bjpowernode.ba03;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Date;

@Aspect
@Component("aspect")
public class MyAspect01 {
/*
*   环绕通知定义方法，方法是实现切面功能的
 *  方法定义的要求：
 * 1.访问权限修饰符是public
 * 2.必须有返回值，推荐是Object
 * 3.方法名称自定义
 * 4.方法有参数，固定是proceedingJoinPoint
 *
*
* 注解是@Around:环绕通知
*   属性:value切入点表达式
*   位置:在方法上面
* 特点:
*   1.环绕通知是功能最强的通知。
*   2.它可以在目标方法的前后都可以增强
*   3.控制目标方法是否被执行
*   4.修改原来目标方法的执行结果。影响最后的调用结果
*
* 参数:ProceedingJoinPoint 等同于Method(用于执行目标方法的)
*
* */
@Around(value = "execution(* com.bjpowernode.ba03.SomeService3Impl.doFirst(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    String name="";
    Object array[]=proceedingJoinPoint.getArgs();
    if(array!=null && array.length>1){
        name=(String) array[0];

    }

    //实现环绕通知:
    Object result=null;
    System.out.println("环绕通知。在目标方法之前"+new Date());
    //1.目标方法调用
    if(name.equals("李红磊")){
        result=proceedingJoinPoint.proceed();//等同于method.invoke();
    }
    //result=proceedingJoinPoint.proceed();//等同于method.invoke();
    System.out.println("环绕通知。在目标方法之后。提交事务");
    //2.在目标方法前面或者后面增强功能


    //修改目标方法的执行结果
    if(result!=null){
        result="整治牛马";
    }


    //返回目标方法的执行结果
        return result;
    }
}
